package com.thinking.in.spring.bean.definition;

import com.thinking.in.spring.bean.factory.DefaultUserFactory;
import com.thinking.in.spring.bean.factory.UserFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;

/**
 * 
 * Bean 的初始化：
 *      1 ： @PostConstruct java API 原生
 *      2 ： 自定义初始化方法
 *      3 ： 实现InitializingBean   - Spring的接口
 *
 * bean 的延迟加载：
 *      1 ：xml 的方式
 *      2 ：@Lazy注解的方式
 *
 *
 * bean 的销毁：
 *      1 ： @PreDestroy
 *      2 :  自定义销毁的方法
 *      3 ： 实现 DisposableBean    - Spring 的 接口
 *
 * @author zjiajia
 * @date 2021/12/28 20:09
 */
@Configuration
public class BeanInitializationDemo {


    public static void main(String[] args) {
        // 创建容器
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();

        // 注册配置类
        applicationContext.register(BeanInitializationDemo.class);
        // 启动
        System.out.println("应用上下文准备启动===============");
        applicationContext.refresh();
        System.out.println("应用上下文完成启动================");

        // 依赖查找
        UserFactory userFactory = applicationContext.getBean(UserFactory.class);

        System.out.println(userFactory);
        // 关闭
        System.out.println("应用上下文准备关闭。。。。");
        applicationContext.close();
        System.out.println("应用上下文完成关闭。。。。");
    }

    /**
     * 延迟初始化 和 非延迟初始化 ：
     *      延时初始化在依赖查找的时候才会初始化
     *      非延迟初始化，在容器启动的时候就初始化了
     * @return  userFactory
     */
    @Bean(initMethod = "initFactory",destroyMethod = "doDestroy")
    @Lazy
    public UserFactory userFactory(){
        return new DefaultUserFactory();
    }



}
